class Solution {
    public boolean isValidSudoku(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') { // only check non-empty cells
                    if (!isValid(i, j, board, board[i][j])) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public boolean isValid(int row, int col, char[][] board, char c) {
        for (int i = 0; i < 9; i++) {
            // Check the row
            if (i != col && board[row][i] == c) {
                return false;
            }
            // Check the column
            if (i != row && board[i][col] == c) {
                return false;
            }
            // Check the 3x3 subgrid
            int subgridRow = 3 * (row / 3) + i / 3;
            int subgridCol = 3 * (col / 3) + i % 3;
            if ((subgridRow != row || subgridCol != col) && board[subgridRow][subgridCol] == c) {
                return false;
            }
        }
        return true;
    }
}
